#include "bsp_gpio.h"



void BSP_MOROT_CTRL_GPIO_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	
	RCC_AHB1PeriphClockCmd(M_GPIO_CLK_0,ENABLE);	
	RCC_AHB1PeriphClockCmd(M_GPIO_CLK_1,ENABLE);	
	/*****************************************GPIOC***************************************************/
	GPIO_InitStructure.GPIO_Pin   = M0_DIR_GPIO_PIN | M1_DIR_GPIO_PIN | M2_DIR_GPIO_PIN | M3_DIR_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
	GPIO_Init(M_GPIO_PORT_0, &GPIO_InitStructure);
	GPIO_SetBits(M_GPIO_PORT_0,M0_DIR_GPIO_PIN | M1_DIR_GPIO_PIN | M2_DIR_GPIO_PIN | M3_DIR_GPIO_PIN);

	
	GPIO_InitStructure.GPIO_Pin   = M4_DIR_GPIO_PIN | M4_EN_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
	GPIO_Init(M_GPIO_PORT_1, &GPIO_InitStructure);
	GPIO_SetBits(M_GPIO_PORT_1,M4_EN_GPIO_PIN | M4_DIR_GPIO_PIN);	
	
}



void BSP_GPIO_RELAY_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RELAY_GPIO_CLK_0,ENABLE);	
	RCC_AHB1PeriphClockCmd(RELAY_GPIO_CLK_1,ENABLE);
	
  GPIO_InitStructure.GPIO_Pin = RELAY_0_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(RELAYGPIO_PORT_0, &GPIO_InitStructure);
	GPIO_ResetBits(RELAYGPIO_PORT_0,RELAY_0_GPIO_PIN);
	
	GPIO_InitStructure.GPIO_Pin = RELAY_1_GPIO_PIN | RELAY_2_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(RELAYGPIO_PORT_1, &GPIO_InitStructure);
	GPIO_ResetBits(RELAYGPIO_PORT_1,RELAY_1_GPIO_PIN | RELAY_2_GPIO_PIN);
}


void BSP_GPIO_LED_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(LED_R_GPIO_CLK,ENABLE);	
	RCC_AHB1PeriphClockCmd(LED_G_GPIO_CLK,ENABLE);
	RCC_AHB1PeriphClockCmd(LED_B_GPIO_CLK,ENABLE);
	
  GPIO_InitStructure.GPIO_Pin = LED_R_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(LED_R_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = LED_G_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(LED_G_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = LED_B_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(LED_B_GPIO_PORT, &GPIO_InitStructure);
}

void BSP_GPIO_RC_Config(void)
{
	GPIO_InitTypeDef  GPIO_InitStructure;
	RCC_AHB1PeriphClockCmd(RH_0_GPIO_CLK | RH_1_GPIO_CLK,ENABLE);	
  GPIO_InitStructure.GPIO_Pin = HRON_1_GPIO_PIN | RC_1_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(RH_0_GPIO_PORT, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = RC_0_GPIO_PIN;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
	GPIO_Init(RH_1_GPIO_PORT, &GPIO_InitStructure);
}




uint8_t GPIO_Read(GPIO_Read_t *GPIO_Read)
{
	GPIO_Read->Polarity = GPIO_ReadInputDataBit(GPIO_Read->GPIOx,GPIO_Read->GPIO_Pin);
	return GPIO_Read->Polarity;
}


void GPIO_Out(GPIO_Out_t *GPIO,uint8_t state)
{
	if(state != TOG)
		state = (GPIO->Polarity == NEG) ? (!state) : (state);
	
	if(state == 1)
	{
		GPIO_SetBits(GPIO->GPIOx,GPIO->GPIO_Pin);
	}
	else if(state == 0)
	{
		GPIO_ResetBits(GPIO->GPIOx,GPIO->GPIO_Pin);
	}
	else if(state == TOG)
	{
		GPIO_ToggleBits(GPIO->GPIOx,GPIO->GPIO_Pin);
	}
}


void BSP_GPIO_Config(void)
{
	BSP_GPIO_LED_Config();
	BSP_GPIO_RC_Config();
}



